package com.czk.bootlettuce.controller;

import com.czk.bootlettuce.utils.GetIPUtils;
import com.czk.bootlettuce.utils.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

/**
 * @Author:ChenZhangKun
 * @Date: 2021/11/5 23:46
 */
@RestController
@Slf4j
@RequestMapping("/limit")
public class LimitRequestAttackController {

    @Resource
    private DefaultRedisScript<Long> limitScript;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping(value = "/productlist")
    public String productList() {
        // 获取ip
        String ip = GetIPUtils.getIp();
        // 设置redis的key
        List<String> keys = Arrays.asList("pruductAPI:" + ip);
        // 执行lua脚本，execute方法有3个参数，第一个参数是lua脚本对象，第二个是key列表，第三个是lua的参数数组
        // 30代表30秒 ，10代表超过10次，也就是说同个ip 30秒内不能超过10次请求
        Long n = this.stringRedisTemplate.execute(this.limitScript, keys, "30", "10");
        String result = "";
        // 非法请求
        if (n == 0) {
            result = "非法请求";
        } else {
            result = "返回商品列表";
        }
        log.info("ip={}请求结果：{}", ip, result);
        return result;
    }
}

